﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SST_BL;
using System.Data;

namespace TCU
{
    public partial class ManejoHorarios : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string user = Request.ServerVariables["REMOTE_USER"].ToString();           
                if (MainBL.RevisarPermiso(user.Substring(user.IndexOf("\\") + 1), "Administrador"))
                    this.CargarHorarios();
                else
                    Server.Transfer("NoAccess.aspx");
            }
        }

        private void CargarHorarios() {
            DataTable dt = MainBL.ListarHorarios();
            
            if (dt == null)
            {
                dt = new DataTable();
                dt.Columns.Add("HorarioID", typeof(int));
                dt.Columns.Add("NombreHorario", typeof(string));
                dt.Columns.Add("HoraInicio", typeof(string));
                dt.Columns.Add("HoraFin", typeof(string));
                dt.Columns.Add("Dias", typeof(string));
                dt.Rows.Add(0, "No hay ningun horario...");
                gvHorarios.AutoGenerateDeleteButton = false;
                gvHorarios.AutoGenerateEditButton = false;
            }
            else
            {
                gvHorarios.AutoGenerateDeleteButton = true;
                gvHorarios.AutoGenerateEditButton = true;
            }
            gvHorarios.DataSource = dt;
            gvHorarios.DataBind();

        }

        protected void gvHorarios_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("Agregar"))
            {

                /*
                 TextBox txtNombre = gvInformaticos.FooterRow.FindControl("txtNombre") as TextBox;
                DropDownList dropRol = gvInformaticos.FooterRow.FindControl("dropRol") as DropDownList;
                 * 
                 * 
                 */
                TextBox txtNombre = gvHorarios.FooterRow.FindControl("txtNombreHorario") as TextBox;
                TextBox txtHoraInicio = gvHorarios.FooterRow.FindControl("txtHoraInicio") as TextBox;
                TextBox txtHoraFin = gvHorarios.FooterRow.FindControl("txtHoraFin") as TextBox;
                CheckBoxList chklstDias = gvHorarios.FooterRow.FindControl("chklstDias") as CheckBoxList;

                if (!txtNombre.Text.Equals("") && !txtHoraInicio.Text.Equals("") && !txtHoraFin.Text.Equals("") && RevisarChklstDias(chklstDias))
                {
                    int horaInicio = FormatearHora(txtHoraInicio.Text);
                    int horaFin = FormatearHora(txtHoraFin.Text);
                    if (horaFin > horaInicio)
                    {
                        bool[] dias = CheckBoxListToBoolArray(chklstDias);

                        if (MainBL.AgregarHorario(txtNombre.Text, horaInicio, horaFin, dias))
                        {
                            notificacionHorario.Text = "El horario pudo ser agregado!";
                            notificacionHorario.ForeColor = System.Drawing.Color.Green;
                            CargarHorarios();
                        }
                        else {
                            notificacionHorario.Text = "El horario no pudo ser agregado!";
                        }

                    }
                    else {
                        notificacionHorario.Text = "La hora de inicio debe de estar antes que la hora fin!";
                    }
                }
                else {
                    notificacionHorario.Text = "Favor llenar todos los campos! ";
                }

            }
        }

        /// <summary>
        /// Esta funcion revisar un check box list, para que no haya ninguno vacio.
        /// </summary>
        /// <param name="list">Checkbox List a revisar</param>
        /// <returns>true si hay algun check box marcado, false de lo contrario</returns>
        private bool RevisarChklstDias(CheckBoxList list) {             
            for (int i = 0; i < list.Items.Count; i++)
                if (list.Items[i].Selected == true)
                    return true;
            return false;
        }

        /// <summary>
        /// Pasa la hora del formato de 24 horas (e.g. 00:00 14:00 16:30) al formato en minutos (e.g. 0 720 870 )
        /// </summary>
        /// <param name="horaSinFormato"> el string en formato de 24 horas</param>
        /// <returns> un int en formato de minutos</returns>
        private int FormatearHora(string horaSinFormato) {
            string[] horaSplit = horaSinFormato.Split(':');
            return int.Parse(horaSplit[0]) * 60 + int.Parse(horaSplit[1]);           
        }

        /// <summary>
        /// Pasa las opciones de un check box list a un array de bool
        /// </summary>
        /// <param name="list">CheckBoxList a evaluar</param>
        /// <returns>un bool[] en base al check box list</returns>
        private bool[] CheckBoxListToBoolArray(CheckBoxList list) { 
            bool[] items = new bool[list.Items.Count];
            for (int i = 0; i < list.Items.Count; i++)
                items[i] = list.Items[i].Selected;
            return items;
        }

        protected void gvHorarios_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            Label lbHorarioID = gvHorarios.Rows[e.RowIndex].FindControl("lbEditID") as Label;
            TextBox txtEditNombre = gvHorarios.Rows[e.RowIndex].FindControl("txtEditNombreHorario") as TextBox;
            TextBox txtEditHoraInicio = gvHorarios.Rows[e.RowIndex].FindControl("txtEditHoraInicio") as TextBox;
            TextBox txtEditHoraFin = gvHorarios.Rows[e.RowIndex].FindControl("txtEditHoraFin") as TextBox;
            CheckBoxList chklstEditDias = gvHorarios.Rows[e.RowIndex].FindControl("chklstEditDias") as CheckBoxList;

            if (!txtEditNombre.Text.Equals("") && !txtEditHoraInicio.Text.Equals("") && !txtEditHoraFin.Text.Equals("") && RevisarChklstDias(chklstEditDias))
            {
                int HoraInicio = FormatearHora(txtEditHoraInicio.Text);
                int HoraFin = FormatearHora(txtEditHoraFin.Text);
                if (HoraInicio < HoraFin)
                {
                    bool[] dias = CheckBoxListToBoolArray(chklstEditDias);
                    if (MainBL.EditarHorario(int.Parse(lbHorarioID.Text),
                                            txtEditNombre.Text,
                                            HoraInicio,
                                            HoraFin,
                                            dias
                                            ))
                    {
                        notificacionHorario.Text = "El horario pudo ser editado!";
                        notificacionHorario.ForeColor = System.Drawing.Color.Green;
                        gvHorarios.EditIndex = -1;
                        this.CargarHorarios();
                    }
                    else {
                        notificacionHorario.Text = "El horario no pudo ser editado";
                    }
                }
                else
                {
                    notificacionHorario.Text = "La hora de inico debe de estar antes que la hora final!";
                }
            }
            else {
                notificacionHorario.Text = "Favor llenar todos los campos!";
            }

        }     

        protected void gvHorarios_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gvHorarios.EditIndex = e.NewEditIndex;
            this.CargarHorarios();

            Label lbID = gvHorarios.Rows[e.NewEditIndex].FindControl("lbEditID") as Label;            
            bool[] dias = MainBL.GetHorarioDias(int.Parse(lbID.Text));
            CheckBoxList chklstEditDias = gvHorarios.Rows[e.NewEditIndex].FindControl("chklstEditDias") as CheckBoxList;
            for (int i = 0; i < dias.Length; i++)
                chklstEditDias.Items[i].Selected = dias[i];

        }

        protected void gvHorarios_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gvHorarios.EditIndex = -1;
            this.CargarHorarios();
        }

        protected void gvHorarios_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            Label id = gvHorarios.Rows[e.RowIndex].FindControl("lbID") as Label;
            if(MainBL.EliminarHorario(int.Parse(id.Text))){
                notificacionHorario.Text = "El horario pudo ser eliminado!";
                notificacionHorario.ForeColor = System.Drawing.Color.Green;
            }else{
                notificacionHorario.Text = "El horario no pudo se eliminado!";
            }
            this.CargarHorarios();
        }
    



    }
}